package com.yixia.pea.controller;

import com.yixia.common.annotation.Log;
import com.yixia.common.config.YiXiaConfig;
import com.yixia.common.core.controller.BaseController;
import com.yixia.common.core.domain.AjaxResult;
import com.yixia.common.enums.BusinessType;
import com.yixia.common.utils.StringUtils;
import com.yixia.common.utils.file.FileUploadUtils;
import com.yixia.common.utils.file.FileUtils;
import com.yixia.common.utils.page.TableDataInfo;
import com.yixia.framework.config.ServerConfig;
import com.yixia.pea.domain.dto.PeaHzBaseDto;
import com.yixia.pea.service.PeaHzBaseService;
import com.yixia.pea.service.PeaScoreService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

/**
 * @author: 依梦
 * @Date 2023/9/1
 */

@Slf4j
@RestController
@RequestMapping("/credit/peasants")
public class PeaBaseController extends BaseController {

    @Autowired
    private PeaHzBaseService hzBaseService;

    @Autowired
    private PeaScoreService peaScoreService;

    @Autowired
    private ServerConfig serverConfig;

    /**
     * 身份证照片等的私密信息的上传
     */
    @PostMapping("/upload/idCardOther")
    public AjaxResult uploadFile(MultipartFile file) throws IOException {
        log.info("身份证照片等的私密信息的上传---单文件上传...");
        try {
            /*1. 先找到存放照片的文件夹位置*/
            String filePath = YiXiaConfig.getUploadIdCardOthersPath();
            /*2. 将照片进行存入*/
            String fileName = FileUploadUtils.upload(filePath, file);
            String url = serverConfig.getUrl() + fileName;
            AjaxResult ajax = AjaxResult.success();
            ajax.put("url", url);
            ajax.put("fileName", fileName);
            ajax.put("newFileName", FileUtils.getName(fileName));
            ajax.put("originalFilename", file.getOriginalFilename());
            return ajax;
        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }
    }

    /**
     * 添加农户信息
     * 将农户信息和家庭成员信息放到数据库中
     * @param peaHzBaseDto 农户信息
     * @return 结果
     */
    @PostMapping("/add")
    @Log(title = "农户管理->添加农户", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody PeaHzBaseDto peaHzBaseDto) {
        /*1. 验证该身份证是否已经添加*/
        if (!hzBaseService.checkIdCardNumUnique(peaHzBaseDto)) {
            return error("新增农户'" + peaHzBaseDto.getHzName() + "'失败，该农户身份证号已存在");
        }
        if (!hzBaseService.checkPhoneNumberNumUnique(peaHzBaseDto)) {
            return error("新增农户'" + peaHzBaseDto.getHzName() + "'失败，该农户手机号码已存在");
        }
        /*2. 进行数据的添加*/
        return toAjax(hzBaseService.insertPeaHzBase(peaHzBaseDto));
    }

    /**
     * 修改农户信息
     *
     * @param peaHzBaseDto 农户信息
     * @return 结果
     */
    @PostMapping("/edit")
    @Log(title = "农户管理->修改农户", businessType = BusinessType.UPDATE)
    public AjaxResult edit(@RequestBody PeaHzBaseDto peaHzBaseDto) {
        /*1. 验证该身份证是否已经添加*/
        hzBaseService.checkPeaDataScope(peaHzBaseDto.getHzId());
        if (!hzBaseService.checkIdCardNumUnique(peaHzBaseDto)) {
            return error("修改农户'" + peaHzBaseDto.getHzName() + "'失败，该农户身份证号已存在");
        }
        if (!hzBaseService.checkPhoneNumberNumUnique(peaHzBaseDto)) {
            return error("修改农户'" + peaHzBaseDto.getHzName() + "'失败，该农户手机号码已存在");
        }
        /*2. 进行数据的修改*/
        return toAjax(hzBaseService.editPeaHzBase(peaHzBaseDto));
    }

    /**
     * 进行分页查询
     */
    @ApiOperation("分页查询")
    @GetMapping("/list")
    @PreAuthorize("@yixia.hasPermi('credit:pea:list')")
    public TableDataInfo list(PeaHzBaseDto peaHzBaseDto) {
        // 1.分页参数
        startPageByHelper();
        // 2. 进行分页查询
        List<PeaHzBaseDto> list = hzBaseService.selectListPage(peaHzBaseDto);
        return getDataTable(list);
    }

    /**
     * 获取详情
     * @param hzId 户主ID
     * @return 纤细结果
     */
    @GetMapping("/info/{hzId}")
    public AjaxResult getInfo(@PathVariable Long hzId) {
        // 1. 判断是否有数据权限进行查询
        hzBaseService.checkPeaDataScope(hzId);
        // 2. 进行详细查询
        return success(hzBaseService.selectPeaBaseById(hzId));
    }

    /**
     * 开始评分
     * 修改农户状态
     * 开始评分后就不能再修改农户信息了
     * 此时系统会随机分配给5个评议员，让他们进行评判
     * 并且系统根据上交的数值信息进行打分评判
     *
     */
    @PutMapping("/startScoring/{hzId}")
    // @PreAuthorize("@yixia.hasPermi('cre:pea:edit')")
    @Transactional
    @Log(title = "农户管理->开始评分", businessType = BusinessType.INSERT)
    public AjaxResult startScoring(@PathVariable Long hzId){
        // 检查是否有该数据权限
        // 1. 判断是否有数据权限进行查询
        if (StringUtils.isNotNull(hzId)){
            hzBaseService.checkPeaDataScope(hzId);
        }
        // 2. 开始进行评分
        hzBaseService.startScoring(hzId);
        // 3. 有评议员权限的人可以对其进行评议
        // 随机抽取本部门数据的评议员，对数据进行评分
        peaScoreService.randomAllotSenator(hzId);
        return success();
    }
}
